<?php

Yii::import('zii.widgets.grid.CGridColumn');

class OrderColumn extends CGridColumn {

    public $modelClass;
    public $ajaxUrl;
    public $cssClass = 'order_link';
    private $_upIcon;
    private $_downIcon;
    private $_topIcon; //đầu trang hiện hành
    private $_bottomIcon; //cuối trang hiện hành
    private $myData;

    public function init() {
        $this->ajaxUrl = array(Yii::app()->controller->id . "/sortOrder");

        $this->_topIcon    = '<span class="haveIconHover ui-icon ui-icon-arrowthickstop-1-n float-left"></span>';
        $this->_upIcon     = '<span class="haveIconHover ui-icon ui-icon-arrowthick-1-n float-left"></span>';
        $this->_downIcon   = '<span class="haveIconHover ui-icon ui-icon-arrowthick-1-s float-left"></span>';
        $this->_bottomIcon = '<span class="haveIconHover ui-icon ui-icon-arrowthickstop-1-s float-left" style="margin-right:0;"></span>';

        $this->registScript();
        $this->myData = $this->grid->dataProvider->data;
    }

    public function renderDataCellContent($row, $data) {
        $this->ajaxUrl['pk1'] = $data->primaryKey;

        $this->ajaxUrl['pk2']  = $this->getTopRowId();
        $this->ajaxUrl['move'] = 'top';
        $top                   = CHtml::link($this->_topIcon, $this->ajaxUrl, array('class' => $this->cssClass));

        $this->ajaxUrl['pk2']  = $this->getPrevRowId($row);
        $this->ajaxUrl['move'] = 'up';
        $up                    = CHtml::link($this->_upIcon, $this->ajaxUrl, array('class' => $this->cssClass));

        $this->ajaxUrl['pk2']  = $this->getNextRowId($row);
        $this->ajaxUrl['move'] = 'down';
        $down                  = CHtml::link($this->_downIcon, $this->ajaxUrl, array('class' => $this->cssClass));

        $this->ajaxUrl['pk2']  = $this->getBottomRowId();
        $this->ajaxUrl['move'] = 'bottom';
        $bottom                = CHtml::link($this->_bottomIcon, $this->ajaxUrl, array('class' => $this->cssClass));

        echo $top . $up . $down . $bottom;
    }

    /**
     * Lấy giá trị cột ID của dòng đầu tiên trong trang hiện tại
     * @return integer
     */
    private function getTopRowId() {
        return $this->myData[0]->id;
    }

    /**
     * Lấy giá trị cột ID của dòng cuối cùng trong trang hiện tại
     * @return integer
     */
    private function getBottomRowId() {
        $maxIndex = count($this->myData) - 1;
        return $this->myData[$maxIndex]->id;
    }

    /**
     * Lấy giá trị cột ID của dòng xuất hiện trước dòng hiện hành
     * @param integer $row index của dòng hiện hành
     * @return integer
     */
    private function getPrevRowId($row) {
        if ($row > 0) {
            $prevRow = $row - 1;
            $result  = $this->myData[$prevRow]->id;
        } else {
            $pageObj = $this->grid->dataProvider->pagination;
            $curPage = $pageObj->currentPage;

            if ($curPage == 0)
                $result = $this->myData[$row]->id;
            else { //Kiểm tra vị trí của record này trong DB
                $model = CActiveRecord::model($this->modelClass);

                $item   = $model->sortGetGreater(
                    $this->grid->dataProvider->criteria, $pageObj->pageSize, $curPage
                );
                $result = $item;
            }
        }

        return $result;
    }

    /**
     * Lấy giá trị cột ID của dòng xuất hiện sau dòng hiện hành
     * @param integer $row index của dòng hiện hành
     * @return integer
     */
    private function getNextRowId($row) {
        $maxIndex = $this->getTotalRow();

        if ($row < $maxIndex) {
            $nextRow = $row + 1;
            $result  = $this->myData[$nextRow]->id;
        } else {
            $pageObj   = $this->grid->dataProvider->pagination;
            $curPage   = $pageObj->currentPage;
            $pageCount = $pageObj->pageCount - 1;

            if ($curPage == $pageCount)
                $result = $this->myData[$maxIndex]->id;
            else { //Kiểm tra vị trí của record này trong DB
                $model = CActiveRecord::model($this->modelClass);

                $item   = $model->sortGetLesser(
                    $this->grid->dataProvider->criteria, $pageObj->pageSize, $curPage
                );
                $result = $item;
            }
        }

        return $result;
    }

    private function getTotalRow() {
        return (count($this->myData) - 1);
    }

    private function registScript() {
        $gridId = $this->grid->getId();
        $msg = Yii::t('DadminModule.message', 'loading');

        $script = <<<SCRIPT
$(document).ready(function() {
    $('.{$this->cssClass}').live('click', function(e) {
        var link = $(this).attr('href');
        var params = {
                msg: '$msg'
            };
            $('#null').showLoading(params);

    $.ajax({
      cache: false,
      dataType: 'json',
      type: 'get',
      url: link,
      success: function(data) {
          $.fn.yiiGridView.update('$gridId', {
              complete: function(data){
                  $('#null').dialog('close');
              }
          });
      }
    });
    
    return false;
  });
});
SCRIPT;

        Yii::app()->clientScript->registerScript(
            __CLASS__ . "#{$this->cssClass}", $script, CClientScript::POS_END
        );
    }

}

?>